from collections import deque

# 数据结构和算法

# Q: 一个包含N个元素的元祖或序列,分解为N个单独的变量
data = ['i','am','pig']
_,a,_=data
#print(a)


# Q: 从某个可迭代对象中分解出N个元素, 如果可迭代对象长度超过N,会导致出现"too many values to upack"的异常
def drop_first_last(grades):
    first,*middle,last = grades
    return middle


# Q: 希望在迭代或者其他形式的处理过程中对最后几项纪录做个有限的历史记录统计
def search(lines, patten, history=5):
    previous_lines = deque(maxlen=history) # deque(maxlen=N) 创建固定长度的队列
    for line in lines:
        if patten in line:
            yield line, previous_lines  # yield 生成器函数,程序暂停，返回yield后面表达式的值，在下一次调用的时候，从yield语句暂停的地方继续执行，如此循环，直到函数执行完。
            previous_lines.append(line)  # 书里有个刊误,这样才能过滤出所有带有patten的lines

if __name__ == '__main__':
    with open('demo.txt') as f:
        for line, prevlines in search(f,'Python',2):
            for pline in prevlines:
                print(pline, end="")
            #print(line, end="") #这句似乎也是多余的
            print('-'*20)


